import { GetanButtonGroupProps, GetanButtonProps } from "@/components/ButtonGroup"
import { PermissionProps } from "@/components/Permission"
import { OrderBy, QueryCondition, SorterType, QueryComparator } from "@/constant/types"
import { FetchResult } from "@/http"
import { VNodeChild } from "vue"

/**
 * 列属性
 */
export interface GetanTableColumnProps extends PermissionProps {
    // 列键，保证唯一
    property: string
    // 列名
    title: string | (() => VNodeChild)
    // 列宽
    width?: string | number
    // 排列顺序
    align?: "left" | "right" | "center"
    // 是否固定
    fixed?: "left" | "right" | undefined
    // 列宽是否可拖动，默认都可以搬动
    resizable?: boolean
    // 超出省略
    ellipsis?: boolean
    // 统计
    summary?: SummaryFunction | GetanTableSummaryColumnInnerProps
    // 自定义渲染
    render?: (rowData: Recordable, rowIndex: number) => VNodeChild
    // 排序
    sorter?: boolean | OrderBy
    // 行是否禁用，不可选择
    rowDisabled?: boolean | ((rowData: Recordable, rowIndex: number) => boolean)
    // 列是否显示
    show?: boolean | (() => boolean)
    // 没有权限时，列是否显示，string 则使用字符显示，否则使用函数进行自定义显示
    showWhenNoPermission?: string | ((rowData: Recordable, rowIndex: number) => VNodeChild)
    // 支持查询
    useQuery?: boolean
}

export interface GetanTableOperateColumnProps extends Omit<GetanTableColumnProps, "property" | "title"> {
    title?: string | (() => VNodeChild)
    actions: GetanButtonGroupProps | GetanButtonProps[]
}

/**
 * 分页属性
 */
export interface GetanPaginationProps {}

/**
 * 统计
 */
export interface GetanTableSummaryProps {
    // 统计行名称
    title?: string | GetanTableSummaryTitleProps
    // 列配置
    columns: (GetanTableSummaryColumnProps | string)[]
}

/**
 * 统计标题
 */
export interface GetanTableSummaryTitleProps {
    // 显示标题
    title: string
    // 关联的列名
    refColumn: string
    // 占用列
    colSpan?: number
}

/**
 * 统计列
 */
export interface GetanTableSummaryColumnProps {
    // 统计列
    refColumn: string
    // 占用列
    colSpan?: number
    // 后台属性
    property?: string
    // 统计方法：平均值、合计
    function?: SummaryFunction
    // 自定义
    render?: () => VNodeChild
}

/**
 * 统计列
 */
export interface GetanTableSummaryColumnInnerProps extends Omit<GetanTableSummaryColumnProps, "refColumn"> {}

export type SummaryFunction = "AVG" | "SUM"

/**
 * 表格属性
 */
export interface GetanTableProps {
    // 列配置
    columns: GetanTableColumnProps[]
    // 列表数据
    data?: Recordable[]
    // 唯一标识键
    rowKey?: string | (() => string)
    // 静态过滤条件，不能调整，不会显示
    defaultFilter?: Recordable
    // 动态过滤条件，会显示到表格的查询条件面板，并可以进行调整
    filter?: GetanTableFilterType | GetanTableFilterType[]
    // 请求函数
    request?: (params: Recordable) => Promise<FetchResult>
    // 统计
    summary?: string | GetanTableSummaryProps | GetanTableSummaryProps[]
    // 默认
    defaultSorter?: GetanTableSorterType[]
    // 根据设备高度动态调整表格最大高度
    useFlexHeight?: boolean | number | string
    // 支持序列号
    useIndex?: boolean
    // 支持分页
    usePagination?: boolean | GetanPaginationProps
    // 支持自定义查询
    useCustomQuery?: boolean
    // 支持选择行，单选 & 多选
    useRowSelect?: "single" | "multiple"
    // 左边操作按钮
    leftActions?: GetanButtonGroupProps
    // 左边操作按钮
    rightActions?: GetanButtonGroupProps
    // 操作按钮
    rowActions?: GetanTableOperateColumnProps
    // 鼠标划过行时背景色
    // hoverColor:
}

export interface GetanTableSorterType extends SorterType {}

export interface GetanTableFilterType extends QueryCondition {}

/**
 * 查询条件
 */
export interface GetanTableFilterProps {
    property: string
    comparators: QueryComparator[]
    input: any
}

/**
 * @description: 弹窗对外暴露的方法
 */
export interface DataTableMethods {
    init?: (props: Partial<GetanTableProps>) => void
    loadData: () => void
    setTableData: (data: Recordable<any>[]) => void
    getTableData: () => Recordable<any>[]
    setFilterConditions: (conditions: GetanTableFilterType[]) => void
}

export type RegisterFn = (Instance: DataTableMethods) => void

export type UseTableReturnType = { register: RegisterFn; methods: DataTableMethods }
